home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 142 / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan).7z / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan) (Track 1).bin / tools / s44play / s44p101s.lzh / adpcm.s next >
Text File  |  1999-11-16  |  14KB  |  512 lines

  1.     .include    global.mac
  2.     .include    preconv.mac
  3.  
  4. ADPCM2PCM_BUFFER_SIZE    equ    4096    ;最大256KB=262144(ループカウンタの制限)
  5.  
  6. ;----------------------------------------------------------------
  7. ;ADPCMデコーダの準備
  8.     .text
  9.     .align    4,$2048
  10. init_adpcm::
  11.     bsr    make_adpcm2pcm_table
  12.     move.l    #adpcm2pcm_table,preconv_adpcm_pos
  13.     clr.w    preconv_adpcm_pcm
  14.     rts
  15.  
  16.     .data
  17.     .even
  18. preconv_adpcm_pcm:    .ds.w    1
  19.     .align    4
  20. preconv_adpcm_pos:    .ds.l    1
  21.  
  22. ;----------------------------------------------------------------
  23. ;ADPCM→PCM変換テーブルを作る
  24. PREDICTION_STAGES    equ    49    ;予測指標の数(最大74まで)
  25.     .text
  26.     .align    4,$2048
  27. make_adpcm2pcm_table:
  28.     movem.l    d0-d7/a0-a6,-(sp)
  29.     tst.b    adpcm2pcm_table_constructed
  30.     bne    99f
  31. ;ADPCMデータ(0~15)毎のスケーリング済みの予測値のテーブルを作る
  32.     lea.l    (base_prediction_table,pc),a0
  33.     lea.l    scaled_prediction_table,a1
  34.     moveq.l    #PREDICTION_STAGES-1,d3
  35. 3:    lea.l    (2*8,a1),a2
  36.     move.w    (a0)+,d1        ;1/8×8
  37.   .if 0
  38. ;整数乗算なので誤差は蓄積しない
  39.     move.w    d1,d2            ;1/8×8
  40.     add.w    d2,d2            ;2/8×8
  41.   .else
  42. ;小数点以下を切り捨てる
  43.   .endif
  44. ;0,8→1/8,-1/8
  45.   .if 0
  46.     move.w    d1,d0            ;1/8×8
  47.   .else
  48.     move.w    d1,d0            ;1/8×8
  49.     lsr.w    #3,d0
  50.     lsl.w    #2,d0
  51.     move.w    d0,d2
  52.     add.w    d0,d0
  53.     add.w    d2,d0
  54.   .endif
  55.     move.w    d0,(a1)+
  56.     neg.w    d0            ;-1/8×8
  57.     move.w    d0,(a2)+
  58. ;1,9→3/8,-3/8
  59.   .if 0
  60.     add.w    d2,d1            ;3/8×8
  61.     move.w    d1,d0            ;3/8×8
  62.   .else
  63.     move.w    d1,d0
  64.     lsr.w    #2,d0
  65.     move.w    d0,d2
  66.     lsr.w    #1,d0
  67.     add.w    d2,d0
  68.     lsl.w    #2,d0
  69.     move.w    d0,d2
  70.     add.w    d0,d0
  71.     add.w    d2,d0
  72.   .endif
  73.     move.w    d0,(a1)+
  74.     neg.w    d0            ;-3/8×8
  75.     move.w    d0,(a2)+
  76. ;2,10→5/8,-5/8
  77.   .if 0
  78.     add.w    d2,d1            ;5/8×8
  79.     move.w    d1,d0            ;5/8×8
  80.   .else
  81.     move.w    d1,d0
  82.     lsr.w    #1,d0
  83.     move.w    d0,d2
  84.     lsr.w    #2,d0
  85.     add.w    d2,d0
  86.     lsl.w    #2,d0
  87.     move.w    d0,d2
  88.     add.w    d0,d0
  89.     add.w    d2,d0
  90.   .endif
  91.     move.w    d0,(a1)+
  92.     neg.w    d0            ;-5/8×8
  93.     move.w    d0,(a2)+
  94. ;3,11→7/8,-7/8
  95.   .if 0
  96.     add.w    d2,d1            ;7/8×8
  97.     move.w    d1,d0            ;7/8×8
  98.   .else
  99.     move.w    d1,d0
  100.     lsr.w    #1,d0
  101.     move.w    d0,d2
  102.     lsr.w    #1,d0
  103.     add.w    d0,d2
  104.     lsr.w    #1,d0
  105.     add.w    d2,d0
  106.     lsl.w    #2,d0
  107.     move.w    d0,d2
  108.     add.w    d0,d0
  109.     add.w    d2,d0
  110.   .endif
  111.     move.w    d0,(a1)+
  112.     neg.w    d0            ;-7/8×8
  113.     move.w    d0,(a2)+
  114. ;4,12→9/8,-9/8
  115.   .if 0
  116.     add.w    d2,d1            ;9/8×8
  117.     move.w    d1,d0            ;9/8×8
  118.   .else
  119.     move.w    d1,d0
  120.     lsr.w    #3,d0
  121.     add.w    d1,d0
  122.     lsl.w    #2,d0
  123.     move.w    d0,d2
  124.     add.w    d0,d0
  125.     add.w    d2,d0
  126.   .endif
  127.     move.w    d0,(a1)+
  128.     neg.w    d0            ;-9/8×8
  129.     move.w    d0,(a2)+
  130. ;5,13→11/8,-11/8
  131.   .if 0
  132.     add.w    d2,d1            ;11/8×8
  133.     move.w    d1,d0            ;11/8×8
  134.   .else
  135.     move.w    d1,d0
  136.     lsr.w    #2,d0
  137.     move.w    d0,d2
  138.     lsr.w    #1,d0
  139.     add.w    d2,d0
  140.     add.w    d1,d0
  141.     lsl.w    #2,d0
  142.     move.w    d0,d2
  143.     add.w    d0,d0
  144.     add.w    d2,d0
  145.   .endif
  146.     move.w    d0,(a1)+
  147.     neg.w    d0            ;-11/8×8
  148.     move.w    d0,(a2)+
  149. ;6,14→13/8,-13/8
  150.   .if 0
  151.     add.w    d2,d1            ;13/8×8
  152.     move.w    d1,d0            ;13/8×8
  153.   .else
  154.     move.w    d1,d0
  155.     lsr.w    #1,d0
  156.     move.w    d0,d2
  157.     lsr.w    #2,d0
  158.     add.w    d2,d0
  159.     add.w    d1,d0
  160.     lsl.w    #2,d0
  161.     move.w    d0,d2
  162.     add.w    d0,d0
  163.     add.w    d2,d0
  164.   .endif
  165.     move.w    d0,(a1)+
  166.     neg.w    d0            ;-13/8×8
  167.     move.w    d0,(a2)+
  168. ;7,15→15/8,-15/8
  169.   .if 0
  170.     add.w    d2,d1            ;15/8×8
  171.     move.w    d1,d0            ;15/8×8
  172.   .else
  173.     move.w    d1,d0
  174.     lsr.w    #1,d0
  175.     move.w    d0,d2
  176.     lsr.w    #1,d0
  177.     add.w    d0,d2
  178.     lsr.w    #1,d0
  179.     add.w    d2,d0
  180.     add.w    d1,d0
  181.     lsl.w    #2,d0
  182.     move.w    d0,d2
  183.     add.w    d0,d0
  184.     add.w    d2,d0
  185.   .endif
  186.     move.w    d0,(a1)+
  187.     neg.w    d0            ;-15/8×8
  188.     move.w    d0,(a2)+
  189. ;
  190.     movea.l    a2,a1
  191.     dbra    d3,3b
  192. ;
  193. ;ADPCMデータ(0~15)毎の予測指標の遷移のテーブルを作る
  194.     lea.l    (walking_clip_table,pc),a0    ;予測指標のクリッピングのテーブルの先頭+予測指標×2
  195.     lea.l    prediction_walking_table,a1    ;予測指標の遷移のテーブルの先頭
  196.     moveq.l    #PREDICTION_STAGES-1,d3
  197. 3:    lea.l    (2*8,a1),a2
  198. ;0,1,2,3,8,9,10,11→-1
  199.     move.w    (-2*1,a0),d0        ;(予測指標-1)×32,クリッピング済み
  200.     move.w    d0,(a1)+
  201.     move.w    d0,(a2)+
  202.     move.w    d0,(a1)+
  203.     move.w    d0,(a2)+
  204.     move.w    d0,(a1)+
  205.     move.w    d0,(a2)+
  206.     move.w    d0,(a1)+
  207.     move.w    d0,(a2)+
  208. ;4,12→+2
  209.     move.w    (+2*2,a0),d0        ;(予測指標+2)×32,クリッピング済み
  210.     move.w    d0,(a1)+
  211.     move.w    d0,(a2)+
  212. ;5,13→+4
  213.     move.w    (+2*4,a0),d0        ;(予測指標+4)×32,クリッピング済み
  214.     move.w    d0,(a1)+
  215.     move.w    d0,(a2)+
  216. ;6,14→+6
  217.     move.w    (+2*6,a0),d0        ;(予測指標+6)×32,クリッピング済み
  218.     move.w    d0,(a1)+
  219.     move.w    d0,(a2)+
  220. ;7,15→+8
  221.     move.w    (+2*8,a0),d0        ;(予測指標+8)×32,クリッピング済み
  222.     move.w    d0,(a1)+
  223.     move.w    d0,(a2)+
  224. ;
  225.     addq.l    #2,a0            ;予測指標のクリッピングのテーブルの先頭+予測指標×2
  226.     movea.l    a2,a1
  227.     dbra    d3,3b
  228. ;
  229. ;ADPCM→PCM変換テーブルを作る
  230. ;下位→上位
  231.     lea.l    adpcm2pcm_table,a1    ;ADPCM→PCM変換テーブルの先頭
  232.     lea.l    scaled_prediction_table,a4    ;スケーリング済みの予測値のテーブルの先頭
  233.     lea.l    prediction_walking_table,a5    ;予測指標の遷移のテーブルの先頭
  234.     movea.l    a1,a0            ;ADPCM→PCM変換テーブルの先頭
  235.                     ;    +1番目の予測指標×2048
  236.                     ;    +ADPCMデータ×8
  237.     movea.l    a4,a2            ;スケーリング済みの予測値のテーブルの先頭
  238.                     ;    +1番目の予測指標×32
  239.                     ;    +下位4ビット(0~15)×2
  240.     movea.l    a5,a3            ;予測指標の遷移のテーブルの先頭
  241.                     ;    +1番目の予測指標×32
  242.                     ;    +下位4ビット(0~15)×2
  243.     moveq.l    #PREDICTION_STAGES-1,d3
  244. 3:    moveq.l    #0,d2            ;上位4ビット(0~15)×2
  245.     moveq.l    #16-1,d1
  246. 1:
  247.   .rept 16
  248.     move.w    (a2)+,(a0)+        ;1番目(下位4ビット)の予測値
  249.     move.w    (a3)+,d0        ;2番目の予測指標×32
  250.     add.w    d2,d0            ;2番目の予測指標×32+上位4ビット(0~15)×2
  251.     move.w    (a4,d0.w),(a0)+        ;2番目(上位4ビット)の予測値
  252.     move.w    (a5,d0.w),d0        ;次回の予測指標×32
  253.     ext.l    d0
  254.     asl.l    #6,d0            ;次回の予測指標×2048
  255.     add.l    a1,d0            ;ADPCM→PCM変換テーブルの先頭+次回の予測指標×2048
  256.     move.l    d0,(a0)+        ;ADPCM→PCM変換テーブルの先頭+次回の予測指標×2048
  257.   .endm
  258.     addq.w    #2,d2            ;上位4ビット(0~15)×2
  259.     lea.l    (-2*16,a2),a2
  260.     lea.l    (-2*16,a3),a3
  261.     dbra    d1,1b
  262.     lea.l    (+2*16,a2),a2
  263.     lea.l    (+2*16,a3),a3
  264.     dbra    d3,3b
  265. ;
  266.     st.b    adpcm2pcm_table_constructed
  267. 99:    movem.l    (sp)+,d0-d7/a0-a6
  268.     rts
  269.  
  270. BASE_PREDICTION    .macro    n,val
  271.   .if n<PREDICTION_STAGES
  272. @ans = val+0.125            ;0.125加えてから切り捨てる→7捨8入
  273.     .dc.w    @ans
  274.     .fail    @ans>32767
  275.   .endif
  276.     .endm
  277.  
  278. ;予測指標から予測値を求めるためのテーブル
  279. ;    32768/1.1^(80-n)のテーブル
  280.     .even
  281. base_prediction_table:
  282.   .if 0
  283.     BASE_PREDICTION    0,15.9968739344382707796302152641
  284.     BASE_PREDICTION    1,17.5965613278820978575932367905
  285.     BASE_PREDICTION    2,19.3562174606703076433525604696
  286.     BASE_PREDICTION    3,21.2918392067373384076878165165
  287.     BASE_PREDICTION    4,23.4210231274110722484565981682
  288.     BASE_PREDICTION    5,25.763125440152179473302257985
  289.     BASE_PREDICTION    6,28.3394379841673974206324837835
  290.     BASE_PREDICTION    7,31.1733817825841371626957321618
  291.     BASE_PREDICTION    8,34.290719960842550878965305378
  292.     BASE_PREDICTION    9,37.7197919569268059668618359158
  293.     BASE_PREDICTION    10,41.4917711526194865635480195074
  294.     BASE_PREDICTION    11,45.6409482678814352199028214581
  295.     BASE_PREDICTION    12,50.205043094669578741893103604
  296.     BASE_PREDICTION    13,55.2255474041365366160824139644
  297.     BASE_PREDICTION    14,60.7481021445501902776906553608
  298.     BASE_PREDICTION    15,66.8229123590052093054597208969
  299.     BASE_PREDICTION    16,73.5052035949057302360056929866
  300.     BASE_PREDICTION    17,80.8557239543963032596062622852
  301.     BASE_PREDICTION    18,88.9412963498359335855668885137
  302.     BASE_PREDICTION    19,97.8354259848195269441235773651
  303.     BASE_PREDICTION    20,107.618968583301479638535935102
  304.     BASE_PREDICTION    21,118.380865441631627602389528612
  305.     BASE_PREDICTION    22,130.218951985794790362628481473
  306.     BASE_PREDICTION    23,143.24084718437426939889132962
  307.     BASE_PREDICTION    24,157.564931902811696338780462582
  308.     BASE_PREDICTION    25,173.321425093092865972658508841
  309.     BASE_PREDICTION    26,190.653567602402152569924359725
  310.     BASE_PREDICTION    27,209.718924362642367826916795697
  311.     BASE_PREDICTION    28,230.690816798906604609608475267
  312.     BASE_PREDICTION    29,253.759898478797265070569322793
  313.     BASE_PREDICTION    30,279.135888326676991577626255073
  314.     BASE_PREDICTION    31,307.04947715934469073538888058
  315.     BASE_PREDICTION    32,337.754424875279159808927768638
  316.     BASE_PREDICTION    33,371.529867362807075789820545502
  317.     BASE_PREDICTION    34,408.682854099087783368802600052
  318.     BASE_PREDICTION    35,449.551139508996561705682860057
  319.     BASE_PREDICTION    36,494.506253459896217876251146063
  320.     BASE_PREDICTION    37,543.956878805885839663876260669
  321.     BASE_PREDICTION    38,598.352566686474423630263886736
  322.     BASE_PREDICTION    39,658.18782335512186599329027541
  323.     BASE_PREDICTION    40,724.006605690634052592619302951
  324.     BASE_PREDICTION    41,796.407266259697457851881233246
  325.     BASE_PREDICTION    42,876.04799288566720363706935657
  326.     BASE_PREDICTION    43,963.652792174233924000776292227
  327.     BASE_PREDICTION    44,1060.01807139165731640085392145
  328.     BASE_PREDICTION    45,1166.0198785308230480409393136
  329.     BASE_PREDICTION    46,1282.62186638390535284503324495
  330.     BASE_PREDICTION    47,1410.88405302229588812953656945
  331.     BASE_PREDICTION    48,1551.9724583245254769424902264
  332.     BASE_PREDICTION    49,1707.16970415697802463673924903
  333.     BASE_PREDICTION    50,1877.88667457267582710041317394
  334.     BASE_PREDICTION    51,2065.67534202994340981045449133
  335. ;↑15倍が32767を越えない範囲
  336.     BASE_PREDICTION    52,2272.24287623293775079149994047
  337.     BASE_PREDICTION    53,2499.46716385623152587064993451
  338.     BASE_PREDICTION    54,2749.41388024185467845771492796
  339.     BASE_PREDICTION    55,3024.35526826604014630348642076
  340.     BASE_PREDICTION    56,3326.79079509264416093383506283
  341.     BASE_PREDICTION    57,3659.46987460190857702721856912
  342.     BASE_PREDICTION    58,4025.41686206209943472994042603
  343.     BASE_PREDICTION    59,4427.95854826830937820293446863
  344.     BASE_PREDICTION    60,4870.7544030951403160232279155
  345.     BASE_PREDICTION    61,5357.82984340465434762555070705
  346.     BASE_PREDICTION    62,5893.61282774511978238810577775
  347.     BASE_PREDICTION    63,6482.97411051963176062691635553
  348.     BASE_PREDICTION    64,7131.27152157159493668960799108
  349.     BASE_PREDICTION    65,7844.39867372875443035856879019
  350.     BASE_PREDICTION    66,8628.83854110162987339442566921
  351.     BASE_PREDICTION    67,9491.72239521179286073386823613
  352.     BASE_PREDICTION    68,10440.8946347329721468072550597
  353.     BASE_PREDICTION    69,11484.9840982062693614879805657
  354.     BASE_PREDICTION    70,12633.4825080268962976367786223
  355.     BASE_PREDICTION    71,13896.8307588295859274004564845
  356.     BASE_PREDICTION    72,15286.513834712544520140502133
  357.     BASE_PREDICTION    73,16815.1652181837989721545523463
  358. ;↑15/8倍が32767を越えない範囲
  359.     BASE_PREDICTION    74,18496.6817400021788693700075809
  360.     BASE_PREDICTION    75,20346.349914002396756307008339
  361.     BASE_PREDICTION    76,22380.9849054026364319377091729
  362.     BASE_PREDICTION    77,24619.0833959429000751314800902
  363.     BASE_PREDICTION    78,27080.9917355371900826446280992
  364.     BASE_PREDICTION    79,29789.0909090909090909090909091
  365. ;↑32767を越えない範囲
  366.   .else
  367. ;PCM8.Xのテーブル
  368.     .fail    PREDICTION_STAGES<>49
  369.     .dc.w      16,  17,  19,  21,  23,  25,  28
  370.     .dc.w      31,  34,  37,  41,  45,  50,  55
  371.     .dc.w      60,  66,  73,  80,  88,  97, 107
  372.     .dc.w     118, 130, 143, 157, 173, 190, 209
  373.     .dc.w     230, 253, 279, 307, 337, 371, 408
  374.     .dc.w     449, 494, 544, 598, 658, 724, 796
  375.     .dc.w     876, 963,1060,1166,1282,1411,1552
  376.   .endif
  377.  
  378. ;予測指標のクリッピングのテーブル
  379. ;    予測指標が範囲内に収まるようにクリッピングする
  380. ;    マイナス側は最小値-1まで,プラス側は最大値+8まで必要.
  381. ;    テーブルのオフセットに使うのであらかじめ32倍しておく.
  382.     .even
  383.         .dc.w    0*32
  384. walking_clip_table:
  385. n = 0
  386.   .rept PREDICTION_STAGES
  387.         .dc.w    n*32
  388. n = n+1
  389.   .endm
  390.   .rept 8
  391.         .dc.w    (PREDICTION_STAGES-1)*32
  392.   .endm
  393.  
  394.     .data
  395. adpcm2pcm_table_constructed:
  396.         .dc.b    0        ;-1=ADPCM→PCM変換テーブル生成済み
  397.  
  398.     .bss
  399. ;ADPCMデータ(0~15)毎のスケーリング済みの予測値のテーブル
  400. ;    予測値をADPCMデータ(0~15)毎にスケーリングした結果
  401.     .even
  402. scaled_prediction_table:
  403.         .ds.w    16*PREDICTION_STAGES
  404.  
  405. ;ADPCMデータ(0~15)毎の予測指標の遷移のテーブル
  406. ;    予測指標はADPCMデータ(0~15)毎に遷移先が異なる.
  407. ;    ADPCMデータ(0~15)毎の予測指標の遷移先を32倍したテーブル.
  408.     .even
  409. prediction_walking_table:
  410.         .ds.w    16*PREDICTION_STAGES
  411.  
  412. ;ADPCM→PCM変換テーブル
  413. ;    予測指標とADPCMデータ(4ビット×2データ=1バイト)から,
  414. ;        1番目の予測値.w
  415. ;        2番目の予測値.w
  416. ;        ADPCM→PCM変換テーブルの先頭+次回の予測指標×2048.l
  417. ;    の8バイトを求めるためのテーブル.
  418.     .align    8
  419. adpcm2pcm_table:
  420.         .ds.b    8*256*PREDICTION_STAGES
  421.  
  422. ;----------------------------------------------------------------
  423. ;----------------------------------------------------------------
  424. ;ADPCMデータの前処理(ADPCMデータをOPMのTLの並びに変換する)
  425. ;<a0.l:出力バッファの先頭
  426. ;<a1.l:入力データの先頭
  427. ;<a2.l:入力データの末尾+1
  428. ;>a0.l:出力データの末尾+1
  429. ;>a1.l:出力データの先頭
  430. ;?d1-d7/a2-a6
  431.     .text
  432.  
  433. START_PRECONV_BUFFER    .macro    side
  434.     bsr    adpcm2pcm_block
  435.     movea.l    preconv_dst_top_ptr,Adst
  436.     .endm
  437.  
  438. LOOP_PRECONV_BUFFER    .macro    side
  439.     bsr    adpcm2pcm_block
  440.     cmpa.l    Asrc,Alim
  441.     beq    @f
  442.     jmp    (Ajmp)
  443. @@:
  444.     .endm
  445.  
  446. GET_DATA_0    .macro    src,dat,tmp
  447.     move.w    (src)+,dat
  448.     .endm
  449.  
  450.   .irp %q,LQ,HQ,SQ
  451.     .align    4,$2048
  452. preconv_adpcm_%q::
  453.     move.l    a0,preconv_dst_top_ptr
  454.     move.l    a1,preconv_src_cur_ptr
  455.     move.l    a2,preconv_src_lim_ptr
  456.     PRECONV_MONO_%q
  457.     movea.l    preconv_dst_top_ptr,a1
  458.     rts
  459.   .endm
  460.  
  461. ;----------------------------------------------------------------
  462.     .text
  463.     .align    4,$2048
  464. adpcm2pcm_block:
  465.     movem.l    d0-d2,-(sp)
  466.     lea.l    adpcm2pcm_buffer,Alim
  467.     movea.l    preconv_src_cur_ptr,Asrc
  468.     move.l    preconv_src_lim_ptr,d2
  469.     sub.l    Asrc,d2
  470.     beq    9f
  471.     cmp.l    #ADPCM2PCM_BUFFER_SIZE/4,d2
  472.     bls    @f
  473.     move.w    #ADPCM2PCM_BUFFER_SIZE/4,d2
  474. @@:
  475.     movea.l    preconv_adpcm_pos,Atbl
  476. ;<Atbl.l:ADPCM→PCM変換テーブルの先頭+予測指標(0~48)*2048
  477.     move.w    preconv_adpcm_pcm,d0
  478. ;<d0.w:PCMデータ
  479.     subq.w    #1,d2
  480.     lsr.w    #1,d2
  481.     bcc    3f
  482. 2:    moveq.l    #0,d1
  483.     move.b    (Asrc)+,d1
  484.     lsl.w    #3,d1
  485.     adda.l    d1,Atbl
  486.     add.w    (Atbl)+,d0
  487.     move.w    d0,(Alim)+
  488.     add.w    (Atbl)+,d0
  489.     move.w    d0,(Alim)+
  490.     movea.l    (Atbl),Atbl
  491. 3:    moveq.l    #0,d1
  492.     move.b    (Asrc)+,d1
  493.     lsl.w    #3,d1
  494.     adda.l    d1,Atbl
  495.     add.w    (Atbl)+,d0
  496.     move.w    d0,(Alim)+
  497.     add.w    (Atbl)+,d0
  498.     move.w    d0,(Alim)+
  499.     movea.l    (Atbl),Atbl
  500.     dbra    d2,2b
  501.     move.w    d0,preconv_adpcm_pcm
  502.     move.l    Atbl,preconv_adpcm_pos
  503.     move.l    Asrc,preconv_src_cur_ptr
  504. 9:    lea.l    pcm2tl_table+32768,Atbl
  505.     lea.l    adpcm2pcm_buffer,Asrc
  506.     movem.l    (sp)+,d0-d2
  507.     rts
  508.  
  509.     .bss
  510.     .align    4
  511. adpcm2pcm_buffer:    .ds.b    ADPCM2PCM_BUFFER_SIZE
  512.